home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
cat
/
execv.i
< prev
next >
Wrap
Text File
|
1997-10-26
|
4KB
|
120 lines
IMPLEMENTATION MODULE ExecV;
(*$A+*)
FROM SYSTEM IMPORT ADDRESS,ADR;
FROM MagicTypes IMPORT PtrPD;
IMPORT MagicSys, MagicDOS;
PROCEDURE Pexec(mode: MagicSys.sCARDINAL;
VAR Path: ARRAY OF CHAR;
VAR CmdLn: ARRAY OF CHAR;
VAR Env: ARRAY OF CHAR): MagicSys.sINTEGER;
TYPE
tpChar = POINTER TO CHAR;
lcPtr = POINTER TO LONGCARD;
VAR
env,
ptr,
tmpPtr,
von,bis: tpChar;
el,
pl,
cl,
D0: MagicSys.sCARDINAL;
path,cmdln: tpStr;
BasePage: PtrPD;
res : MagicSys.sINTEGER;
BEGIN
IF (LENGTH(Path)=0) OR (LENGTH(CmdLn)=0) THEN (* CreateBasePage, Exec[Free][Return] *)
(* ARGV nicht mglich *)
RETURN MagicDOS.Pexec(mode,Path,CmdLn,Env)
ELSE (* Load, LoadExec[Return|Replace] *)
path := ADR(Path);
cmdln := ADR(CmdLn);
el := 0;
IF LENGTH(Env)=0 THEN
BasePage := MagicSys.Basepage();
ptr := BasePage^.pEnv;
ELSE
ptr := ADR(Env);
END;
von := ptr;
WHILE ptr^#0C DO
WHILE ptr^#0C DO INC(ptr); INC(el) END;
INC(ptr); INC(el)
END;
pl := 0; WHILE path^[pl]#0C DO INC(pl) END; INC(pl);
cl := 0; D0 := 1;
LOOP
WHILE cmdln^[D0]=' ' DO INC(D0) END; (* Leerzeichen berlesen *)
IF cmdln^[D0]<' ' THEN EXIT END; (* Fertig *)
WHILE cmdln^[D0]>' ' DO (* Argument *)
INC(cl); INC(D0)
END;
INC(cl); (* Platz fr trennendes 0C/' ' *)
END;
env := MagicDOS.Malloc(el+7+pl+cl); (* 7: "ARGV=" *)
Environment := env;
IF LONGCARD(env)>0 THEN
ptr := env;
bis := von + ADDRESS(LONG(el));
(* Altes Environment kopieren bis auf
* alten ARGV, falls vorhanden
*)
WHILE LONGCARD(von)<LONGCARD(bis) DO
IF lcPtr(ptr)^ = $65827186 (* "ARGV" *)
THEN
tmpPtr := ptr+ADDRESS(4L);
IF tmpPtr^ = '='
THEN
(* "ARGV=" gefunden, Ende suchen *)
WHILE (tmpPtr^ # 0C) & (LONGCARD(tmpPtr) < LONGCARD(bis)) DO
INC (tmpPtr);
(* Durch folgende Zeile wird sichergestellt, das nur 0C0C
* die Suche abbricht
*)
IF tmpPtr^ = 0C THEN INC (tmpPtr) END;
END;
IF (LONGCARD(tmpPtr) < LONGCARD(bis))
THEN
INC (tmpPtr); (* Auf Zeichen nach letztem 0C *)
ptr := tmpPtr;
END;
END;
END;
ptr^ := von^; INC(ptr); INC(von)
END;
ptr^ := 'A'; INC(ptr); ptr^ := 'R'; INC(ptr); ptr^ := 'G'; INC(ptr);
ptr^ := 'V'; INC(ptr); ptr^ := '='; INC(ptr); ptr^ := 0C; INC(ptr);
von := ADDRESS(path);
bis := von + ADDRESS(LONG(pl));
WHILE LONGCARD(von)<LONGCARD(bis) DO
ptr^ := von^; INC(ptr); INC(von)
END;
D0 := 1;
LOOP
WHILE cmdln^[D0]=' ' DO INC(D0) END;
IF cmdln^[D0]<' ' THEN EXIT END;
WHILE cmdln^[D0]>' ' DO
ptr^ := cmdln^[D0];
INC(ptr); INC(D0)
END;
ptr^ := 0C; INC(ptr);
END;
ptr^ := 0C;
cmdln^[0] := 177C (* ARGV-Kennung *)
END;
(*$A+*)
res := MagicDOS.Pexec(mode,path^,cmdln^,tpStr(env)^);
(*$A=*)
IF mode=MagicDOS.LoadnGo THEN
IF MagicDOS.Mfree(Environment) THEN END;
END;
RETURN res;
END;
END Pexec;
END ExecV.